<html>
    <head>
        <title>多租户服务接口  IMultiTenant</title>
    </head>
    <body>
        <script>
            /*
                
                                  1、多租户接口  IMultiTenant

                                            您应该为您的实体实现IMultiTenant接口，以使它们的多租户功能就绪。


                                                (1)、如何为实体开启多租户支持?

                                                                eg: 多租户Product实体

                                                                    using System;
                                                                    using Volo.Abp.Domain.Entities;
                                                                    using Volo.Abp.MultiTenancy;

                                                                    namespace MultiTenancyDemo.Products
                                                                    {
                                                                        public class Product : AggregateRoot<Guid>, IMultiTenant
                                                                        {
                                                                            public Guid? TenantId { get; set; } //  IMultiTenant接口定义的属性

                                                                            public string Name { get; set; }

                                                                            public float Price { get; set; }
                                                                        }
                                                                    }

                                                                IMultiTenant接口只是定义了一个TenantId属性。

                                                                当您实现此接口时，当您从数据库中查询时，ABP会自动为当前租户过滤实体。

                                                                因此，您不需要在执行查询时手动添加TenantId条件。

                                                                默认情况下，租户无法访问另一个租户的数据。


                                                (2)、为什么TenantId属性可以为空？

                                                            IMultiTenant.TenantId是nullable。 
                                                            
                                                            当它为空时，表示该实体归主机端所有，而不归租户所有。

                                                            当您在系统中创建租户和主机端都使用的功能时，它很有用。

                                                            例如，IdentityUser是由Identity Module定义的实体。主机和所有租户都有自己的用户。

                                                                因此，对于主机端，用户将有一个为null的TenantId，而租户用户将有他们相关的TenantId。

                                                            注意：

                                                                如果您的实体是特定于租户的并且在主机端没有任何意义，您可以强制不允许为实体的构造函数中的TenantId设置null。


                                                (3)、什么时候设置TenantId？   
                                                                        
                                                            当您创建新实体对象时，ABP会自动为您设置TenantId。

                                                            这是在baseEntity类的构造函数中完成的（所有其他基本实体和聚合根类都派生自Entity类）。

                                                            TenantId是根据ICurrentTenant.Id属性的当前值设置的（见下一节）。

                                                            如果您为特定实体对象设置了TenantId值，它将覆盖基类设置的值。

                                                            如果您想自己设置TenantId属性，我们建议在您的实体类的构造函数中进行，并且不要再次更改（更新）它。

                                                            （实际上，更改它意味着您正在将实体从租户移动到另一个租户。如果您希望这样，您需要额外关心数据库中的相关实体）

            */
        </script>
    </body>
</html>